ePaper (IL3820) module Library  v0.5
Library for the 2.9-inch WaveShare ePaper display module
il3820_update.c
1 /*
2  * @file il3820_update.c
3  *
4  * @author Matthew Matz & Roy Eltham
5  *
6  * @version 0.5
7  *
8  * @copyright Copyright (C) Parallax, Inc. 2018. See end of file for
9  * terms of use (MIT License).
10  *
11  * @brief Waveshare ePaper display bitmap driver, see il3820_h. for documentation.
12  *
13  * @detail Please submit bug reports, suggestions, and improvements to
14  * this code to editor@parallax.com.
15  */
16 
17 
18 #include "il3820.h"
19 
20 
21 void il3820_updateDisplay(screen_t *dev)
22 {
23 
24  int mask_cs = (1 << dev->dev_id);
25  int mask_sdi = (1 << dev->sdi_pin);
26  int mask_clk = (1 << dev->clk_pin);
27  int mask_dc = (1 << dev->dc_pin);
28 
29  il3820_writeLockSet(dev->dev_id);
30 
31  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, IL3820_SET_RAM_X_ADDRESS_POSITION, 0);
32 
33  /* x point must be the multiple of 8 or the last 3 bits will be ignored */
34  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, 0, 1);
35  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, ((dev->width - 1) >> 3) & 0xFF, 1);
36  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, IL3820_SET_RAM_Y_ADDRESS_POSITION, 0);
37  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, 0, 1);
38  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, 0, 1);
39  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, (dev->height - 1) & 0xFF, 1);
40  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, ((dev->height - 1) >> 8) & 0xFF, 1);
41  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, IL3820_SET_RAM_X_ADDRESS_COUNTER, 0);
42 
43  /* x point must be the multiple of 8 or the last 3 bits will be ignored */
44  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, 0, 1);
45  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, IL3820_SET_RAM_Y_ADDRESS_COUNTER, 0);
46  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, 0, 1);
47  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, 0, 1);
48 
49  while (input(dev->status_pin) == 1); //0: idle, 1: busy
50 
51  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, IL3820_WRITE_RAM, 0);
52 
53  OUTA |= mask_dc; // force data mode
54  il3820_spiWriteBytes(mask_cs, mask_sdi, mask_clk, dev->image_ptr, dev->image_size);
55 
56  // Update display
57  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, IL3820_DISPLAY_UPDATE_2, 0);
58  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, 0xC4, 1);
59  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, IL3820_MASTER_ACTIVATION, 0);
60  il3820_spiWrite(mask_cs, mask_sdi, mask_clk, mask_dc, IL3820_TERMINATE_FRAME_READ_WRITE, 0);
61 
62  il3820_writeLockClear(dev->dev_id);
63 
64  while (input(dev->status_pin) == 1); //0: idle, 1: busy
65 }
66 
67